package voxToolkit;

import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;

import audio.GerenteAudio;

public class VoxTextFieldEvent implements KeyListener, FocusListener
{

	private GerenteAudio sintetizador;
	VoxContexto voxContexto = VoxContexto.instancia();
	static private VoxTextFieldEvent instancia = null;

	private VoxTextFieldEvent()
	{
		sintetizador = GerenteAudio.instancia();
	}

	static public VoxTextFieldEvent instancia ()
	{
		if (instancia == null)
			instancia = new VoxTextFieldEvent();

		return instancia;
	}

	/**
	 * Fala o caracter quando as setas direita e esquerda são pressionadas,
	 * quando o caracter é apagado e fala a frase inteira quando a tecla F10 é
	 * pressionada.
	 */
	@Override
	public void keyPressed ( KeyEvent e )
	{
		VoxTextField voxTextField = (VoxTextField) e.getSource();
		int lastPos = voxTextField.getCaretPosition();
		String conteudo = voxTextField.getText();

		if (e.getKeyCode() == KeyEvent.VK_LEFT)
		{
			if (!e.isControlDown())
			{
				if (lastPos >= 1)
				{
					char caracterAtual = (char) conteudo
							.codePointAt(lastPos - 1);
					String teste = Character.toString(caracterAtual);
					sintetizador.falaSintetizada(teste);
				}
			}
		}

		if (e.getKeyCode() == KeyEvent.VK_RIGHT)
		{
			try
			{
				if (!e.isControlDown())
				{
					char letra = (char) conteudo.codePointAt(lastPos);
					sintetizador.falaSintetizada(Character.toString(letra));
				}
			}
			catch (StringIndexOutOfBoundsException el)
			{
				sintetizador.falaSintetizada("Fim de linha");
			}
			catch (Exception e1)
			{
				e1.printStackTrace();
			}
		}

		if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE)
		{
			try
			{
				sintetizador.falaSintetizada("DEL "
						+ Character.toString(conteudo.charAt(lastPos - 1)));
			}
			catch (Exception e1)
			{
				e1.printStackTrace();
			}

		}

		if (e.getKeyCode() == KeyEvent.VK_F10)
		{
			try
			{
				sintetizador.falaSintetizada(conteudo);
			}
			catch (Exception e1)
			{
				e1.printStackTrace();
			}
		}

	}

	@Override
	public void keyReleased ( KeyEvent e )
	{
		VoxTextField voxTextField;
		String conteudo;
		int posAtual;
		int posFim;

		voxTextField = (VoxTextField) e.getSource();
		conteudo = voxTextField.getText().trim();
		posAtual = voxTextField.getCaretPosition();

		ArrayList guarda = new ArrayList();

		if (e.getKeyCode() == KeyEvent.VK_RIGHT && e.isControlDown())
		{
			try
			{
				int j = 0;
				posFim = posAtual - 1;
				boolean achouLetra = false;
				String palavra = "";

				if (posFim <= conteudo.length() - 1)
				{
					for (int i = posFim; posFim >= 0; --i)
					{
						if (i >= 0)
						{
							if (i <= conteudo.length() - 1)
							{
								if (!Character.isWhitespace(conteudo.charAt(i)))
								{
									guarda.add(conteudo.charAt(i));
									achouLetra = true;
								}

								else
								{
									if (achouLetra)
										break;
								}
							}
							else
								break;
						}
						else
							break;
					}
				}

				for (int i = guarda.size() - 1; i >= 0; --i)
				{
					palavra = palavra + guarda.get(i).toString();
				}
				sintetizador.falaSintetizada(palavra);
			}
			catch (Exception e1)
			{
				e1.printStackTrace();
			}

		}

		if (e.getKeyCode() == KeyEvent.VK_LEFT && e.isControlDown())
		{
			try
			{
				int j = 0;
				int posIni = posAtual;
				boolean achouLetra = false;
				String palavra = "";

				if (posIni <= conteudo.length() - 1)
				{
					for (int i = posIni; posIni <= conteudo.length() - 1; ++i)
					{
						if (i >= 0)
						{
							if (i <= conteudo.length() - 1)
							{
								if (!Character.isWhitespace(conteudo.charAt(i)))
								{
									guarda.add(conteudo.charAt(i));
									achouLetra = true;
								}
								else
								{
									if (achouLetra)
										break;
								}
							}
							else
								break;
						}
						else
							break;
					}
				}

				for (int i = 0; i <= guarda.size() - 1; ++i)
				{
					palavra = palavra + guarda.get(i).toString();
				}
				sintetizador.falaSintetizada(palavra);
			}
			catch (Exception e1)
			{
				e1.printStackTrace();
			}
		}

	}

	/**
	 * Fala cada caracter digitado.
	 * 
	 */
	@Override
	public void keyTyped ( KeyEvent e )
	{
		char tecla = ' ';
		VoxTextField voxTextField;
		voxTextField = (VoxTextField) e.getSource();
		tecla = e.getKeyChar();
		sintetizador.falaSintetizada(Character.toString(tecla));

	}

	/**
	 * Fala o rotulo do componente quando este ganha foco.
	 * 
	 */
	@Override
	public void focusGained ( FocusEvent e )
	{
		VoxTextField voxTextField = (VoxTextField) e.getSource();
		sintetizador.falaSintetizada((voxTextField.getRotulo()));
	}

	@Override
	public void focusLost ( FocusEvent e )
	{
		// TODO Auto-generated method stub

	}

	/*
	 * @Override public void FimDeFala ( SoundEvent e ) { // TODO Auto-generated
	 * method stub
	 * 
	 * }
	 * 
	 * @Override public void eventDispatched ( AWTEvent e ) { if (e instanceof
	 * SoundEvent) FimDeFala((SoundEvent) e);
	 * 
	 * }
	 */

}
